#!/bin/bash

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色

# 配置
API_DIR="./api"
CLIENT_DIR="./client"
MONGO_CONTAINER="sq_mongodb"
MONGO_PORT=27017
CONFIG_FILE="./config.js"

# 确保配置文件存在
if [ ! -f "$CONFIG_FILE" ]; then
  echo -e "${YELLOW}创建默认配置文件 $CONFIG_FILE${NC}"
  echo "{}" > "$CONFIG_FILE"
fi

# 检查必要工具
check_requirements() {
  echo -e "${BLUE}检查开发环境要求...${NC}"
  
  if ! command -v node &> /dev/null; then
    echo -e "${RED}未找到 Node.js，请安装 Node.js v16 或更高版本${NC}"
    exit 1
  fi
  
  if ! command -v pnpm &> /dev/null; then
    echo -e "${YELLOW}未找到 pnpm，建议安装 pnpm 以获得更快的依赖管理${NC}"
    echo -e "安装命令: npm install -g pnpm"
  fi
  
  if ! command -v docker &> /dev/null; then
    echo -e "${RED}未找到 Docker，请安装 Docker${NC}"
    exit 1
  fi
  
  echo -e "${GREEN}环境检查通过${NC}"
}

# 安装依赖
install_deps() {
  local dir=$1
  local name=$2
  
  echo -e "${BLUE}为 $name 安装依赖...${NC}"
  cd "$dir" || exit 1
  
  if [ -f "pnpm-lock.yaml" ]; then
    pnpm install
  elif [ -f "yarn.lock" ]; then
    yarn install
  else
    npm install
  fi
  
  cd - > /dev/null || exit 1
  echo -e "${GREEN}$name 依赖安装完成${NC}"
}

# 启动MongoDB容器
start_mongodb() {
  if docker ps -a | grep -q "$MONGO_CONTAINER"; then
    if ! docker ps | grep -q "$MONGO_CONTAINER"; then
      echo -e "${YELLOW}启动现有的 MongoDB 容器...${NC}"
      docker start "$MONGO_CONTAINER"
    else
      echo -e "${GREEN}MongoDB 容器已在运行${NC}"
    fi
  else
    echo -e "${BLUE}创建并启动 MongoDB 容器...${NC}"
    docker run -d --name "$MONGO_CONTAINER" \
      -p $MONGO_PORT:27017 \
      -v "$(pwd)/data:/data/db" \
      mongo:6.0
  fi
  
  # 等待MongoDB准备就绪
  echo -e "${YELLOW}等待 MongoDB 准备就绪...${NC}"
  sleep 3
  echo -e "${GREEN}MongoDB 已准备就绪!${NC}"
}

# 使用终端多路复用启动服务
start_services() {
  # 检查是否安装了tmux
  if ! command -v tmux &> /dev/null; then
    echo -e "${YELLOW}未找到 tmux，将在分离的终端中启动服务${NC}"
    start_services_separate
    return
  fi
  
  echo -e "${BLUE}使用 tmux 启动服务...${NC}"
  
  # 创建新会话
  tmux new-session -d -s sqtracker
  
  # 分割窗口并启动服务
  tmux split-window -h
  tmux select-pane -t 0
  tmux send-keys "cd $API_DIR && export NODE_ENV=development && npm run dev" C-m
  tmux select-pane -t 1
  tmux send-keys "cd $CLIENT_DIR && export NODE_ENV=development && npm run dev" C-m
  
  # 附加到会话
  echo -e "${GREEN}服务已启动! 连接到 tmux 会话...${NC}"
  echo -e "${YELLOW}提示: 使用 Ctrl+B 然后 D 分离会话${NC}"
  tmux attach-session -t sqtracker
}

# 在分离的终端中启动服务（无tmux）
start_services_separate() {
  echo -e "${BLUE}在分离的终端中启动服务...${NC}"
  
  if command -v gnome-terminal &> /dev/null; then
    gnome-terminal -- bash -c "cd $API_DIR && export NODE_ENV=development && npm run dev; exec bash"
    gnome-terminal -- bash -c "cd $CLIENT_DIR && export NODE_ENV=development && npm run dev; exec bash"
  elif command -v xterm &> /dev/null; then
    xterm -e "cd $API_DIR && export NODE_ENV=development && npm run dev" &
    xterm -e "cd $CLIENT_DIR && export NODE_ENV=development && npm run dev" &
  else
    echo -e "${YELLOW}在后台启动服务，请查看各自目录中的日志${NC}"
    (cd "$API_DIR" && export NODE_ENV=development && npm run dev > ../api.log 2>&1) &
    (cd "$CLIENT_DIR" && export NODE_ENV=development && npm run dev > ../client.log 2>&1) &
    echo -e "${YELLOW}API 日志: ./api.log${NC}"
    echo -e "${YELLOW}客户端日志: ./client.log${NC}"
  fi
  
  echo -e "${GREEN}服务已启动!${NC}"
  echo -e "${GREEN}API 运行在: http://localhost:3001${NC}"
  echo -e "${GREEN}客户端运行在: http://localhost:3000${NC}"
}

# 构建生产版本
build_prod() {
  echo -e "${BLUE}构建生产版本...${NC}"
  
  echo -e "${YELLOW}构建 API...${NC}"
  cd "$API_DIR" || exit 1
  if [ -f "pnpm-lock.yaml" ]; then
    NODE_ENV=production pnpm build
  else
    NODE_ENV=production npm run build
  fi
  cd - > /dev/null || exit 1
  
  echo -e "${YELLOW}构建客户端...${NC}"
  cd "$CLIENT_DIR" || exit 1
  if [ -f "pnpm-lock.yaml" ]; then
    NODE_ENV=production SENTRY_ORG=tdjsnelling SENTRY_PROJECT=sqtracker-frontend pnpm build
  else
    NODE_ENV=production SENTRY_ORG=tdjsnelling SENTRY_PROJECT=sqtracker-frontend npm run build
  fi
  cd - > /dev/null || exit 1
  
  echo -e "${GREEN}构建完成!${NC}"
}

# 停止服务
stop_services() {
  echo -e "${YELLOW}停止服务...${NC}"
  
  # 检查tmux会话是否存在
  if tmux has-session -t sqtracker 2>/dev/null; then
    tmux kill-session -t sqtracker
    echo -e "${GREEN}已终止 tmux 会话${NC}"
  fi
  
  # 尝试终止可能正在运行的node进程
  pkill -f "node.*$API_DIR" || true
  pkill -f "node.*$CLIENT_DIR" || true
  
  echo -e "${GREEN}服务已停止${NC}"
}

# 停止并移除MongoDB容器
stop_mongodb() {
  echo -e "${YELLOW}停止 MongoDB...${NC}"
  
  if docker ps | grep -q "$MONGO_CONTAINER"; then
    docker stop "$MONGO_CONTAINER"
    echo -e "${GREEN}MongoDB 已停止${NC}"
  else
    echo -e "${BLUE}MongoDB 已经停止${NC}"
  fi
  
  if [ "$1" = "remove" ]; then
    docker rm "$MONGO_CONTAINER"
    echo -e "${YELLOW}MongoDB 容器已移除${NC}"
  fi
}

# 显示使用说明
show_help() {
  echo -e "${GREEN}SQTracker 开发助手${NC}"
  echo "使用方法: ./dev.sh [命令]"
  echo ""
  echo "命令:"
  echo "  setup       设置开发环境 (安装依赖)"
  echo "  start       启动开发环境 (MongoDB + API + 客户端)"
  echo "  stop        停止所有服务"
  echo "  restart     重启所有服务"
  echo "  db-start    仅启动 MongoDB"
  echo "  db-stop     停止 MongoDB"
  echo "  db-remove   停止并移除 MongoDB 容器"
  echo "  api-dev     仅在本地启动 API 开发服务器"
  echo "  client-dev  仅在本地启动客户端开发服务器"
  echo "  build       构建生产版本"
  echo "  help        显示此帮助信息"
}

# 主流程
case $1 in
  setup)
    check_requirements
    install_deps "$API_DIR" "API"
    install_deps "$CLIENT_DIR" "客户端"
    ;;
    
  start)
    start_mongodb
    start_services
    ;;
    
  stop)
    stop_services
    stop_mongodb
    ;;
    
  restart)
    stop_services
    stop_mongodb
    start_mongodb
    start_services
    ;;
    
  db-start)
    start_mongodb
    ;;
    
  db-stop)
    stop_mongodb
    ;;
    
  db-remove)
    stop_mongodb "remove"
    ;;
    
  api-dev)
    cd "$API_DIR" || exit 1
    NODE_ENV=development npm run dev
    ;;
    
  client-dev)
    cd "$CLIENT_DIR" || exit 1
    NODE_ENV=development npm run dev
    ;;
    
  build)
    build_prod
    ;;
    
  help|*)
    show_help
    ;;
esac